﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace nr.Reports
{
    /// <summary>
    /// Formato grafico del report
    /// </summary>
    public class ReportStyle
    {
        /// <summary>
        /// sfondo del report
        /// </summary>
        private Brush background;
        /// <summary>
        /// immagine di sfondo del report
        /// </summary>
        private Image backgroundImage;
        /// <summary>
        /// bordo del report 
        /// </summary>
        private Pen border;
        /// <summary>
        /// Colore del testo
        /// </summary>
        private Brush foreColor;
        /// <summary>
        /// font utilizzato nel report
        /// </summary>
        private Font font;
        /// <summary>
        /// intestazione del report
        /// </summary>
        private ReportRowStyle header;
        /// <summary>
        /// pie' di pagina del report
        /// </summary>
        private ReportRowStyle footer;
        /// <summary>
        /// riga in posizione dispari
        /// </summary>
        private ReportRowStyle item;
        /// <summary>
        /// riga in posizione pari
        /// </summary>
        private ReportRowStyle alternatingItem;
        /// <summary>
        /// colonne del report
        /// </summary>
        private List<ReportColumnStyle> columns;
        /// <summary>
        /// indica se stampare la intestazione
        /// </summary>
        private bool headerVisible;
        /// <summary>
        /// indica se stampare il pie' pagina
        /// </summary>
        private bool footerVisible;
        /// <summary>
        /// Legge/Imposta la visibilita' della intestazione
        /// </summary>
        public bool HeaderVisible { get { return headerVisible; } set { headerVisible = value; } }
        /// <summary>
        /// Legge/Imposta la visibilita' del pie' pagina
        /// </summary>
        public bool FooterVisible { get { return footerVisible; } set { footerVisible = value; } }
        /// <summary>
        /// Legge/Imposta il background del report
        /// </summary>
        public Brush Background { get { return background; } set { background = value; } }
        /// <summary>
        /// Legge/Imposta l'immagine da usare come sfondo del report
        /// </summary>
        public Image BackgroundImage { get { return backgroundImage; } set { backgroundImage = value; } }
        /// <summary>
        /// Legge/Imposta il formato del bordo del report
        /// </summary>
        public Pen Border { get { return border; } set { border = value; } }
        /// <summary>
        /// Legge/Imposta il colore del testo del report
        /// </summary>
        public Brush ForeColor { get { return foreColor; } set { foreColor = value; } }
        /// <summary>
        /// Legge/Imposta il font di default del report
        /// </summary>
        public Font Font { get { return font; } set { font = value; } }
        /// <summary>
        /// Legge/Imposta lo stile della intestazione
        /// </summary>
        public ReportRowStyle Header { get { return header; } set { header = value; } }
        /// <summary>
        /// Legge/Imposta lo stile del pie' pagina
        /// </summary>
        public ReportRowStyle Footer { get { return footer; } set { footer = value; } }
        /// <summary>
        /// Legge/Imposta lo stile delle righe in posizione dispari
        /// </summary>
        public ReportRowStyle Item
        {
            get { return item; }
            set
            {
                if (value == null)
                    item = new ReportRowStyle();
                else
                    item = value;
            }
        }
        /// <summary>
        /// Legge/Imposta lo stile delle righe in posizione pari
        /// </summary>
        public ReportRowStyle AlternatingItem
        {
            get { return alternatingItem; }
            set
            {
                if (value == null)
                    alternatingItem = item;
                else
                    alternatingItem = value;
            }
        }
        /// <summary>
        /// Costruttore di default
        /// </summary>
        public ReportStyle()
        {
            HeaderVisible = true;
            FooterVisible = false;
            Header = new ReportRowStyle();
            Footer = new ReportRowStyle();
            Item = new ReportRowStyle();
            AlternatingItem = new ReportRowStyle();
            Header.Font = new Font(Item.Font, FontStyle.Bold);
            Header.Alignment = StringAlignment.Center;
            Header.BackColor = Brushes.LightGray;
            Border = new Pen(Color.Black, 0.5f);
            Background = Brushes.White;
            BackgroundImage = null;
            Font = SystemFonts.DefaultFont;
            ForeColor = Brushes.Black;

            columns = new List<ReportColumnStyle>();
        }
        /// <summary>
        /// Aggiunge uno stile di colonna
        /// </summary>
        /// <param name="columnStyle">Lo stile da aggiungere</param>
        public void AddColumnStyle(ReportColumnStyle columnStyle)
        {
            columns.Add(columnStyle);
        }
        /// <summary>
        /// Aggiunge un insieme di stili di colonna
        /// </summary>
        /// <param name="columnStyles">Insieme da aggiungere</param>
        public void AddColumnStyles(IEnumerable<ReportColumnStyle> columnStyles)
        {
            columns.AddRange(columnStyles);
        }
        /// <summary>
        /// Rimuove uno stile di colonna
        /// </summary>
        /// <param name="columnStyle">Lo stile da rimuovere</param>
        public void RemoveColumnStyle(ReportColumnStyle columnStyle)
        {
            columns.Remove(columnStyle);
        }
        /// <summary>
        /// Rimuove uno stile di colonna
        /// </summary>
        /// <param name="index">L'indice dello stile da rimuovere</param>
        public void RemoveColumnStyleAt(int index)
        {
            columns.RemoveAt(index);
        }
        /// <summary>
        /// Rimuove tutti gli stili di colonna
        /// </summary>
        public void ClearColumnStyles()
        {
            columns.Clear();
        }
        /// <summary>
        /// Legge il numero di stili di colonna
        /// </summary>
        public int ColumnStyles { get { return columns.Count; } }
        /// <summary>
        /// Restituisce lo stile associato ad una colonna
        /// </summary>
        /// <param name="index">Indice della colonna</param>
        /// <returns>Lo stile della colonna indicata</returns>
        public ReportColumnStyle GetColumnStyle(int index) { return columns[index]; }
    }
}
